package com.flowable.test;

import org.flowable.engine.*;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author : liYang
 * @Version: 1.0
 * @date : 2024/11/26 11:28
 * @Desc : 任务分配和流程变量
 */
public class FlowableTest05 {
    /**
     * 部署流程
     *    * 部署流程涉及三张表；
     *    流程部署表；act_re_deployment ;一次流程部署操作就会生成一张表结构
     *    流程定义表：act_re_procdef ; 一次部署操作中包含几个流程定义文件就会产生几条记录
     *    流程定义资源文件：act_ge_bytearray ; 有多少资源就会生成几条记录
     * */

    @Test
    public void testDeploy(){
        // 1、获取 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//根据默认配置，读取数据库为 flowabledb02
        // 2、获取 RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3、完成部署操作
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("FlowableProject01.bpmn20.xml")// 根据xml文件加载流程
                .name("XX公司请假流程")
                .deploy();
        System.out.println("deploy.getId() = " + deploy.getId());
        System.out.println("deploy.getName() = " + deploy.getName());
    }
    /* 执行结果
    * deploy.getId() = 1
    * deploy.getName() = XX公司请假流程
    * */

    /**
     * 启动流程实例
     */
    @Test
    public void testRunProcess(){
        // 1、获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 访问的是flowabledb02数据库
        // 2、启动流程实例通过 RuntimeService 对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 3、构建流程变量
        Map<String,Object> variables = new HashMap<>();
        variables.put("assignee0","张三") ;// 谁申请请假
        variables.put("assignee1","李四"); // 请几天假
        // 4、启动流程实例，第一个参数是流程定义的id
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceById("FlowableProject01:1:4", variables);// select * from act_re_procdef t;    -- 流程表中获取
        // 输出相关的流程实例信息
        System.out.println("流程定义的ID：" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例的ID：" + processInstance.getId());
        System.out.println("当前活动的ID：" + processInstance.getActivityId());
    }
    /*
    * 流程定义的ID：FlowableProject01:1:4
    * 流程实例的ID：2501
    * 当前活动的ID：null
    * */

    /*
     * 查询流程任务查询
     * */
    @Test
    public void testQueryTask(){
        // 1、获取 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();// 访问的是flowabledb02数据库
        // 2、任务相关查询 TaskService
        TaskService taskService = processEngine.getTaskService();
        // 3、获取查询对象
        List<Task> list = taskService.createTaskQuery()
                .deploymentId("2501")
                .taskAssignee("assignee0")
                .list();
        for (Task task : list) {
            System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getAssignee() = " + task.getAssignee());
            System.out.println("task.getName() = " + task.getName());
        }
    }

    /*
     * 处理流程
     * -- 在正常处理流程中涉及到的表结构
     * ACT_RU_EXECUTION 运行时流程执行实例
     * ACT_RU_IDENTITYLINK 运行时用户关系信息
     * ACT_RU_TASK 运行时任务表
     * ACT_RU_VARIABLE 运行时变量表
     * */
    @Test
    public void testCompleteTask(){
        // 获取流程引擎对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processInstanceId("2501")
                .taskAssignee("张三")
                .singleResult();
        // 完成任务
        taskService.complete(task.getId());
    }
    /* 查询任务ASSIGNEE变成李四
    * */

}
